home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / knowhow4 / abstable.cpp < prev    next >
C/C++ Source or Header  |  1994-10-10  |  8KB  |  296 lines

  1. #include "abstable.h"
  2.  
  3. void KH_AbstractTable::repose(rect new_pos)
  4.     {
  5.     Window::repose(new_pos);
  6.     if((xScreen = new_pos.width()) < xPos + iColWidth[colNumbers[xCurs]])
  7.     {
  8.     xStart = xCurs;
  9.     xPos = 0;
  10.     }
  11.     if((yScreen = textRect(user_screen()).height() - 1) < yPos/* + 1*/)
  12.     {
  13.     yStart = yCurs;
  14.     yPos = 0;
  15.     }
  16.  
  17.     }
  18. /////////////////////////////
  19. void KH_AbstractTable::showCursor(rect r, int color, int startX, int startY,
  20.                   int endX, int endY)
  21.     {
  22.     setcolor(color);
  23.  
  24.     setviewport(0, 0, r.corner.X, r.corner.Y, 1);
  25.     ::rectangle(startX, startY, endX, endY);
  26.     setviewport(0, 0, getmaxx(), getmaxy(), 1);
  27.     }
  28. /////////////////////////////
  29. void KH_AbstractTable::line_table(rect r)
  30.     {
  31.     setlinestyle(SOLID_LINE, 1, 1);
  32.     setcolor(BLACK);
  33.     setfillstyle(SOLID_FILL, pColorSet->colors.HDR_BAK_COLOR);
  34.     settextjustify(LEFT_TEXT, BOTTOM_TEXT);
  35.  
  36.     r.origin.Y -= pScreenSet->cell_height;
  37.     setviewport(0, 0, r.corner.X, r.corner.Y, 1);
  38.     bar(r.origin.X + 1, r.origin.Y + 1, r.corner.X - 1,
  39.     r.origin.Y + pScreenSet->cell_height - 1);
  40.     r.origin.Y += pScreenSet->cell_height;
  41.     char fldName[30];
  42.     for(int x = 0, xs = 0, i = 0;
  43.     xs < xScreen
  44.     && i < nColumns; x+= iColWidth[colNumbers[i]], i++)
  45.     if(x >= xStart)
  46.         {
  47.         getFieldName(fldName, colNumbers[i] + 1);
  48.         outtextxy(r.origin.X + screenXL(xs + 1), r.origin.Y - 2, fldName);
  49.  
  50.         xs += iColWidth[colNumbers[i]];
  51.         line(r.origin.X + screenXL(xs),
  52.          r.origin.Y - pScreenSet->cell_height,
  53.          r.origin.X + screenXL(xs), r.corner.Y);
  54.         }
  55.     setviewport(0, 0, getmaxx(), getmaxy(), 1);
  56.     }
  57. /////////////////////////////
  58. void KH_AbstractTable::show()
  59.     {
  60.     Window::show();
  61.     rect r = user_screen();
  62.     r.origin.Y += pScreenSet->cell_height;
  63.     setfillstyle(SOLID_FILL, WHITE);
  64.     setlinestyle(SOLID_LINE, 1, 1);
  65.     setcolor(BLACK);
  66.     settextstyle(DEFAULT_FONT, HORIZ_DIR, 1);
  67.     settextjustify(LEFT_TEXT, BOTTOM_TEXT);
  68.     bar(r);
  69.     char fldName[30];
  70.     for(int y = 0; y < yScreen; y++)
  71.     line(r.origin.X, r.origin.Y + screenYT(y),
  72.          r.corner.X, r.origin.Y + screenYT(y));
  73.  
  74.     line_table(r);
  75.  
  76.     int startX;
  77.     int startY;
  78.     int endX;
  79.     int endY;
  80.  
  81.     int xStartCurs;
  82.     for(int x = 0, i = 0; x < xStart; )
  83.     {
  84.     x+= iColWidth[colNumbers[i]];
  85.     i++;
  86.     }
  87.  
  88.     for(; x < xStart + xScreen && i < nColumns;
  89.     x+= iColWidth[colNumbers[i]], i++)
  90.     for(int j = yStart; j < yStart + yScreen - 1 && j < RecordNumber(); j++)
  91.         showField(x - xStart, colNumbers[i], j, 0, getFieldType(i, j));
  92.  
  93.     getItemPos(r.origin, &startX, &startY, &endX, &endY);
  94.     showCursor(r, BLACK, startX, startY, endX, endY);
  95.     }
  96. //////////////////////////////
  97. void KH_AbstractTable::getItemPos(loc l, int* startX, int* startY, int* endX,
  98.                 int* endY)
  99.     {
  100.     *startX = l.X + screenXL(xPos) + 2;
  101.     *startY = l.Y + screenYT(yPos) + 2;
  102.     *endX = l.X + screenXL(xPos + iColWidth[colNumbers[xCurs]]) - 2;
  103.     *endY = l.Y + screenYT(yPos + 1) - 2;
  104.     }
  105. //////////////////////////////
  106. void KH_AbstractTable::exe(int act)
  107.     {
  108.     e.what = act ? KEYEVENT : NOEVENT;
  109.  
  110.     switch(act)
  111.     {
  112.     case AC_LEFT:   e.key = EVENT_LEFT; break;
  113.     case AC_RIGHT:  e.key = EVENT_RIGHT; break;
  114.     case AC_UP:     e.key = EVENT_UP; break;
  115.     case AC_DOWN:   e.key = EVENT_DN; break;
  116.     case AC_PG_UP:  e.key = EVENT_PG_UP; break;
  117.     case AC_PG_DN:  e.key = EVENT_PG_DN; break;
  118.     case AC_CTRL_PG_UP: e.key = EVENT_CTRL_PG_UP; break;
  119.     case AC_CTRL_PG_DN: e.key = EVENT_CTRL_PG_DN; break;
  120.     case AC_HOME:   e.key = EVENT_HOME; break;
  121.     case AC_END:    e.key = EVENT_END;  break;
  122.     case AC_FIND_FIRST: e.key = EVENT_ALT_F7; break;
  123.     case AC_FIND_NEXT: e.key = EVENT_F7; break;
  124.     case AC_NEXT: e.key = EVENT_F5; break;
  125.     case AC_CANCEL: e.key = (isRet(RET_REMOVE))
  126.         ? EVENT_ALT_F3 : EVENT_ESC;
  127.         break;
  128.     case AC_EDIT:   e.key = EVENT_F9; break;
  129.     case AC_OK:     e.key = EVENT_F2; break;
  130.     }
  131.     rect rc;
  132.     rect r = textRect(rc = user_screen());
  133.     rc.origin.Y += pScreenSet->cell_height;
  134.     mouseHideCursor();
  135.     if(!act)
  136.     hilite();
  137.  
  138.     int on = 0;
  139.     mouseShowCursor();
  140.     int color;
  141.     while(1)
  142.     {
  143.     color = mode == KH_VIEW_TABLE ? BLACK : RED;
  144.     mouseShowCursor();
  145.     if(!act && !(e.what == MOUSEEVENT && !on))
  146.         get_event();
  147.     else
  148.         on = 1;
  149.     mouseHideCursor();
  150.     int startX, startY, endX, endY;
  151.     getItemPos(rc.origin, &startX, &startY, &endX, &endY);
  152.  
  153.     if(e.what == KEYEVENT)
  154.         switch(e.key)
  155.         {
  156.         case EVENT_F5:
  157.             Rotate();
  158.             show();
  159.             break;
  160.         case EVENT_F1: global_i[0] = action_type; return;
  161.         case EVENT_F7:
  162.             searchField(0);
  163.             show();
  164.             break;
  165.         case EVENT_ALT_F7:
  166.             searchField(1);
  167.             show();
  168.             break;
  169.         case EVENT_RIGHT:
  170.             if(Right())
  171.             show();
  172.             else
  173.             showCursor(rc, WHITE, startX, startY, endX, endY);
  174.             break;
  175.         case EVENT_LEFT:
  176.             if(Left())
  177.             show();
  178.             else
  179.             showCursor(rc, WHITE, startX, startY, endX, endY);
  180.             break;
  181.         case EVENT_UP:
  182.             if(Up())
  183.             show();
  184.             else
  185.             showCursor(rc, WHITE, startX, startY, endX, endY);
  186.             break;
  187.         case EVENT_DN:
  188.             if(Down())
  189.             show();
  190.             else
  191.             showCursor(rc, WHITE, startX, startY, endX, endY);
  192.             break;
  193.         case EVENT_HOME:  Home(); show(); break;
  194.         case EVENT_PG_UP: PgUp(); show(); break;
  195.         case EVENT_END:   End(); show(); break;
  196.         case EVENT_PG_DN: PgDown(); show(); break;
  197.         case EVENT_CTRL_PG_UP: CtrlPgUp(); show(); break;
  198.         case EVENT_CTRL_PG_DN: CtrlPgDown(); show(); break;
  199.         case EVENT_CTRL_HOME:  PgLeft(); show(); break;
  200.         case EVENT_CTRL_END:   PgRight(); show(); break;
  201.  
  202.         case EVENT_INS:
  203.             if(mode == KH_EDIT_TABLE)
  204.             {
  205.             insRecord();
  206.             show();
  207.             }
  208.             break;
  209.         case EVENT_DEL:
  210.             if(mode == KH_EDIT_TABLE)
  211.             {
  212.             delRecord();
  213.             show();
  214.             }
  215.             break;
  216.  
  217.         case EVENT_F9:
  218.             if(writeAccess())
  219.             {
  220.             mode = KH_EDIT_TABLE;
  221.             color = RED;
  222.             }
  223.             break;
  224.         case EVENT_RETURN:
  225.             if(mode == KH_EDIT_TABLE) //r.origin + loc(1, 1),
  226.             editField();
  227.             break;
  228.         case EVENT_ESC: global_num = 0; global_i[0] = AC_NULL; return;
  229.         case EVENT_F6:
  230.         case EVENT_F10:
  231.         case EVENT_TAB:
  232.         case EVENT_ALT_F3:
  233.         case EVENT_ALT_F4:
  234.         case EVENT_ALT_TAB:
  235.             unhilite(); global_num = 0; //pos;
  236.             global_i[0] = 0; return;
  237.         case EVENT_F2:
  238.             if(mode == KH_VIEW_TABLE)
  239.             {
  240.             unhilite(); global_num = 1; // pos;
  241.             global_i[0] = action_type; return;
  242.             }
  243.             mode = KH_VIEW_TABLE;
  244.             saveTable();
  245.             showCursor(r, WHITE, startX, startY, endX, endY);
  246.  
  247.             color = BLACK;
  248.             break;
  249.         }
  250.     else
  251.         {
  252.         if(!mouse_in(e.where()))
  253.         {
  254.         unhilite();
  255.         global_num = 0; global_i[0] = AC_NULL;
  256.         return;
  257.         }   // outside of table box
  258.         moveToCell(
  259.         loc((e.where().X - rc.origin.X) / pScreenSet->cell_width,
  260.         (e.where().Y - rc.origin.Y) / pScreenSet->cell_height)
  261.         + loc(0, 1));
  262.         showCursor(rc, WHITE, startX, startY, endX, endY);
  263.         getItemPos(rc.origin, &startX, &startY, &endX, &endY);
  264.         showCursor(rc, color, startX, startY, endX, endY);
  265.         }
  266.     getItemPos(rc.origin, &startX, &startY, &endX, &endY);
  267.     showCursor(rc, color, startX, startY, endX, endY);
  268.  
  269.     if(act)    // leave table and return to the object which calls
  270.         {      // after single processing of "act" command
  271.         global_num = 0; //pos;
  272.         return;
  273.         }
  274.     }
  275.     }
  276. //////////////////////////////
  277. /*
  278. void main()
  279.     {
  280.     if(!init_KNOW_HOW())
  281.     return;
  282.     setfillstyle(SOLID_FILL, pColorSet->colors.BAK_COLOR);
  283.     bar(0, 0, getmaxx(), getmaxy());
  284.  
  285.     int wid[] = { 5, 6, 7, 8, 7, 6, 5, 6, 6, 6 };
  286.     int num[] = { 1, 0, 3, 2, 4, 5, 6, 7, 8 };
  287.     KH_AbstractTable w(rect(10, 10, 50, 20), "window.pcy", " KNOW-HOW 4.x",
  288.            6, 8, wid, num);
  289.  
  290.     w.show_window();
  291.     w.exe();
  292.     w.hide();
  293.     close_KNOW_HOW();
  294.     closegraph();
  295.     }
  296. */